package org.example.Thread;

/**
 * Created with IntelliJ IDEA.
 * Description:单例模式(懒汉模式)
 * User:Lenovo
 * Date:2022-04-09
 * Time:14:39
 */
class Singleton2{
    //1.就不是立即初始化实例
    //  2.使用volatile关键字来保证线程安全
    //  3.使用双重检查锁定来保证线程安全
    //    第一重检查:判断instance是否为null,如果为null,说明还没有初始化过,就加锁
    //    第二重检查:再次判断instance是否为null,如果为null,说明已经加锁,但是还没有初始化过,就初始化实例
    //  4.volatile关键字的作用是禁止指令重排序,保证线程间的可见性
    private static volatile Singleton2 instance = null;
    //2.构造方法设为private
    private Singleton2(){

    }
    //3.提供一个方法来获取上述单例的实例
    //   只有当真正需要用到这个实例的时候,才会真正去创建这个实例
    public static Singleton2 getInstance(){
        //如果这个条件成立,说明当前的单例未初始化过,存在线程安全风险,就需要加锁~~
        if(instance == null){//
            synchronized (Singleton2.class){
                if(instance == null){
                    //只有在真正使用到getInstance的时候才会真的创建实例
                    instance = new Singleton2();
                }
            }
        }
        return instance;
    }
}
public class Demo15 {
    public static void main(String[] args) {
        Singleton2 instance = Singleton2.getInstance();
    }
}
